Hi!
Ich möchte hier auch meine Variante vorstellen, wie ich in meinem neuem Spiel die Missiles nutze. Wobei ich wahrscheinlich es noch einmal ändern muss, weil es zuviele mögliche Schüsse sind 🙂
Im Prinzip ist es bei mir 3-teilig.
1) Auslöseroutine
2) Bewegungsroutine
3) Kollisionsroutine
Für die Missiles lege ich mir 4 Variablen an, wobei theoretisch 3 reichen würden:
1) X-Position des Missile
2) Y-Position des Missile
3) Flugrichtung des Missile
4) Status des Missile
Der PM-Speicherstart für die Missiles wird in der Variable "Missiles" hinterlegt.
PMMemBase EQU $2000 ; $2000 bis $27FF
Missiles EQU PMMemBase+$300
Player0 EQU PMMemBase+$400
Player1 EQU PMMemBase+$500
Player2 EQU PMMemBase+$600
Player3 EQU PMMemBase+$700
MissilesX .DS 4
MissilesY .DS 4
MissilesRi .DS 4
MissilesStat .DS 4
Die Auslöseroutine:
Diese prüft in einer Schleife, welcher Missile ungenutzt ist (MissilesStat). Der erste ungenutzte Missiles wird im X-Register hinterlegt.
LDX #3 ; freien Schuss suchen
@ LDA MissilesStat,X
BEQ MissileSetzen ; freier Missile gefunden
DEX
BPL @-
JMP MissileNichtfrei ; es konnte kein freier Missile gefunden werden
Dadurch ist es egal, welcher der Missiles frei geworden ist, er wird gefunden 😉
Die Routine setzt nun das Missile und die entsprechenden Variablen.
MissileSetzen LDA #1 ; Missile als aktiv markieren
STA MissilesStat,X
LDA PlayerX ; Missile X setzen
STA MissilesX,X
STA HPOSM0,X
LDA PlayerY ; Missile Y setzen
STA MissilesY,X
TAY
LDA Missiles,Y ; Missiles im Speicher lesen
ORA ShootPixel,X ; Bits holen
STA Missiles,Y ; und zurück speichern
und Richtung...
STA MissilesRi,X
...
...
ShootPixel DTA %00000011
DTA %00001100
DTA %00110000
DTA %11000000
Da mein Spieler oft auf der selben Höhe seine Schüsse abgibt, ist es wichtig den Missile per ORA hinzuzufügen.
Wenn ein Missile gesetzt wurde, wird es automatisch in der Bewegungsroutine bis zum Bildschirmrand in der angegebenen Richtung bewegt.
Am Rand angekommen, wird das Missile gelöscht und der Status auf Inaktiv gesetzt:
ShootOff LDA #0
STA MissilesStat,X ; Status auf 0 = Inaktiv
LDA MissilesY,X ; Y-Position holen
TAY
LDA Missiles,Y ; Missile aus Speicher laden
AND ShootMask,X ; per Maske löschen
STA Missiles,Y ; zurück sichern
...
...
ShootMask DTA %11111100
DTA %11110011
DTA %11001111
DTA %00111111
Wie man ein Missile bewegt und die Kollision prüft, sollte bekannt sein.
Beim Bewegen gehe ich übrigens wieder eine Schleife von 3-0 durch und prüfen über den Status, welcher Missile bewegt werden muss.
Bei der Kollision müssen ebenfalls nur aktive Missiles geprüft werden.
Möchte man den Missile nach 20 Schritten wieder löschen, kann man leicht in einer weiteren Variable die Anzahl der Schritte sich merken und dann den Missile löschen.
Ich hoffe ich konnte so in etwa aufzeigen, wie ich es mache 🙂
Grüße
Janko
Meine Projekte findest Du hier...